const User = require('../models/User')
const jwt = require('jsonwebtoken')
const config = require('../config/')
const bcrypt = require('bcryptjs')
const path = require('path')
const UserService = require('../services/UserService')
const UserProfile = require('../models/UserProfile')

// 用户注册
exports.register = async (req, res) => {
	try {
		const { username, password, email } = req.body

		// 使用事务服务注册用户并创建用户配置
		const { user, profile } = await UserService.handleUserRegistration({
			username,
			password,
			email
		})

		// 生成 JWT 令牌
		const token = jwt.sign({ userId: user._id }, config.jwtSecretKey, {
			expiresIn: config.expiresIn
		})

		res.status(200).json({
			message: '注册成功！',
			token,
			userId: user._id,
			profileId: profile._id
		})
	} catch (err) {
		res.status(400).json({ error: err.message })
	}
}

// 用户登录
exports.login = async (req, res) => {
	try {
		const { username, password } = req.body
		const user = await User.findOne({ username })

		if (!user || !(await user.comparePassword(password))) {
			return res.status(401).json({ error: '用户名或密码错误' })
		}

		const token = jwt.sign({ userId: user._id }, config.jwtSecretKey, {
			expiresIn: config.expiresIn
		})

		res.status(200).json({
			message: '登录成功！',
			status: 200,
			token
		})
	} catch (err) {
		res.status(500).json({ error: err.message })
	}
}

// 获取用户信息
exports.getUser = async (req, res) => {
	try {
		const result = await User.findById(req.user.userId).select('-password -__v')

		if (!result) return res.status(404).json({ error: '用户不存在！' })

		res.status(200).json({
			message: '获取成功！',
			status: 200,
			data: result
		})
	} catch (err) {
		res.status(500).json({ error: err.message })
	}
}

// 更新用户信息
exports.updateUser = async (req, res) => {
	try {
		const updates = {}
		if (req.body.email) updates.email = req.body.email
		if (req.body.password) updates.password = await bcrypt.hash(req.body.password, 10)
		if (req.file) updates.avatar = path.posix.join('/uploads', req.file.filename)

		const result = await User.findByIdAndUpdate(
			req.user.userId,
			{ $set: updates },
			{ new: true, runValidators: true }
		).select('-password -__v')

		if (!result) return res.status(404).json({ error: '用户不存在！' })

		res.status(200).json({
			message: '更新成功！',
			status: 200,
			data: result
		})
	} catch (err) {
		res.status(400).json({ error: err.message })
	}
}

// 删除用户
exports.deleteUser = async (req, res) => {
	try {
		const user = await User.findById(req.user.userId)

		if (!user) return res.status(404).json({ error: '用户不存在！' })

		// 使用 Promise.all 并行执行删除操作
		const [userResult, profileResult] = await Promise.all([
			User.deleteOne({ _id: user._id }),
			UserProfile.deleteMany({ userId: user._id })
		])

		if (userResult.deletedCount === 1 && profileResult.deletedCount === 1) {
			res.status(200).json({
				message: '删除成功！',
				status: 200
			})
		} else {
			res.status(500).json({ error: '删除失败！' })
		}
	} catch (err) {
		res.status(500).json({ error: err.message })
	}
}
